package com.wenx.v3system.modular.cloud.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wenx.base.rest.BaseRestService;
import com.wenx.v3system.modular.cloud.domain.dto.SysDepartmentDto;
import com.wenx.v3system.modular.cloud.domain.dto.SysUserDto;
import com.wenx.v3system.modular.cloud.domain.query.DepartmentQuery;
import com.wenx.v3system.modular.cloud.domain.dto.DepartmentOperateDto;
import com.wenx.v3system.modular.cloud.domain.po.SysDepartment;
import com.wenx.v3system.modular.cloud.domain.query.SysDepartmentQuery;

import java.util.List;

/**
 * 系统部门服务接口
 * 基于Enhanced RBAC权限模型
 * 提供部门管理、组织架构和层级关系操作
 * 
 * @author wenx
 * @since 1.0.0
 */
public interface SysDepartmentRestService extends IService<SysDepartment>, BaseRestService<SysDepartmentDto, SysDepartmentQuery> {

    /**
     * 根据部门编码获取部门信息
     * 
     * @param code 部门编码
     * @return 部门信息
     */
    SysDepartmentDto getDepartmentByCode(String code);

    /**
     * 获取用户所属部门
     * 
     * @param userId 用户ID
     * @return 部门信息
     */
    SysDepartmentDto getUserDepartment(Long userId);

    /**
     * 获取部门树形结构
     * 
     * @param parentId 父部门ID，null表示获取根部门
     * @return 部门树列表
     */
    List<SysDepartmentDto> getDepartmentTree(Long parentId);

    /**
     * 获取子部门列表
     * 
     * @param parentId 父部门ID
     * @return 子部门列表
     */
    List<SysDepartmentDto> getChildDepartments(Long parentId);

    /**
     * 获取部门下的所有用户
     * 
     * @param departmentId 部门ID
     * @param includeSubDepartments 是否包含子部门
     * @return 用户列表
     */
    List<Long> getDepartmentUsers(Long departmentId, boolean includeSubDepartments);

    /**
     * 检查部门编码是否存在
     * 
     * @param code 部门编码
     * @param excludeId 排除的部门ID
     * @return 是否存在
     */
    boolean existsByCode(String code, Long excludeId);

    /**
     * 启用部门
     * 
     * @param departmentId 部门ID
     */
    void enableDepartment(Long departmentId);

    /**
     * 禁用部门
     * 
     * @param departmentId 部门ID
     */
    void disableDepartment(Long departmentId);

    /**
     * 移动部门
     * 
     * @param departmentId 部门ID
     * @param targetParentId 目标父部门ID
     * @param targetSort 目标排序
     */
    void moveDepartment(Long departmentId, Long targetParentId, Integer targetSort);

    /**
     * 批量更新部门排序
     * 
     * @param departmentSorts 部门排序列表
     */
    void updateDepartmentSorts(List<SysDepartmentDto> departmentSorts);

    /**
     * 分页查询部门成员
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<?> getDepartmentMembers(DepartmentQuery query);

    /**
     * 添加部门成员
     * 
     * @param request 添加请求
     */
    void addDepartmentMember(DepartmentOperateDto request);

    /**
     * 移除部门成员
     * 
     * @param request 移除请求
     */
    void removeDepartmentMember(DepartmentOperateDto request);

    /**
     * 设置部门负责人
     * 
     * @param request 设置请求
     */
    void setDepartmentManager(DepartmentOperateDto request);

    /**
     * 移动部门
     * 
     * @param request 移动请求
     */
    void moveDepartment(DepartmentOperateDto request);

    /**
     * 获取部门管理员用户列表
     * 查询具有部门管理员角色的用户
     * 
     * @return 部门管理员用户列表
     */
    List<SysUserDto> getDepartmentManagers();

}